package com.ly.cloud.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.ly.cloud.dto.RoleUserDto;
import com.ly.cloud.dto.RoleUserRelationDto;
import com.ly.cloud.dto.UserDto;
import com.ly.cloud.entity.RoleInfoPo;
import com.ly.cloud.entity.RoleUserRelationPo;
import com.ly.cloud.exception.CloudException;
import com.ly.cloud.exception.mapper.DBException;
import com.ly.cloud.mapper.RoleInfoMapper;
import com.ly.cloud.mapper.RoleUserRelationMapper;
import com.ly.cloud.mapper.StudentInfoMapper;
import com.ly.cloud.mapper.TeacherMapper;
import com.ly.cloud.service.RoleManagerService;
import com.ly.cloud.utils.BeanCopyUtils;
import com.ly.cloud.vo.RoleInfoVo;
import com.ly.cloud.vo.RoleUserRelationVo;
import com.ly.cloud.vo.StudentVo;
import com.ly.cloud.vo.TeacherVo;

/**
 * @Author: luhuacong
 * @Description:
 * @Date: Create in 2018/12/28
 */
@Service
@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
public class RoleManagerServiceImpl implements RoleManagerService {

	@Resource
	private RoleInfoMapper roleInfoMapper;	//用户信息mapper
	
	@Resource
	private RoleUserRelationMapper roleUserRelationMapper;	//角色用户关系mapper

	@Resource
	private TeacherMapper teacherMapper;	//老师信息mapper
	
	@Resource
	private StudentInfoMapper studentInfoMapper;	//学生信息mapper
	
	/** 
	 * Method Name:  insertRoleInfo
	 * Description:  
	 * 新增角色信息
	 * @param jsbh 角色编号
	 * @param jsmc 角色名称
	 * @param cjr 创建人
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	public boolean insertRoleInfo(String jsbh, String jsmc,String cjr) {
		RoleInfoPo po = new RoleInfoPo();
		//设置角色编号
		po.setJsbh(jsbh);
		//设置角色名称
		po.setJsmc(jsmc);
		//设置创建人
		po.setCjr(cjr);
		//设置创建时间
		po.setCjsj(new Date());
		try {
			Integer i = roleInfoMapper.insert(po);
			if(i>0) {
				return true;
			}else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("新建角色失败",e);
		}
	}

	/** 
	 * Method Name:  deleteRoleByid
	 * Description:  
	 * 根据编号删除角色信息
	 * @param jsbh 角色编号
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public boolean deleteRoleByid(String jsbh) {
		/**
		 * 先把属于该角色的用户数据删除
		 */
		EntityWrapper<RoleUserRelationPo> ew = new EntityWrapper<>();
		ew.where("JSBH = {0}", jsbh);
		try {
			roleUserRelationMapper.delete(ew);
		} catch (Exception e1) {
			throw new DBException("删除该角色的用户时失败，请重试",e1);
		}
		
		try {
			Integer i = roleInfoMapper.deleteById(jsbh);
			if(i>0) {
				return true;
			}else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("删除角色失败",e);
		}
	}

	/** 
	 * Method Name:  deleteByIdList
	 * Description:  
	 * 批量删除角色信息
	 * @param idList 角色编号集合
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public Integer deleteByIdList(List<String> idList) {
		try {
			Integer count = roleInfoMapper.deleteBatchIds(idList);
			return count;
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("批量删除角色失败",e);
		}
	}

	
	
	/** 
	 * Method Name:  updateRoleInfo
	 * Description:  
	 * 修改角色信息
	 * @param jsbh 角色编号
	 * @param jsmc 角色名称
	 * @param cjr 修改人
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	public boolean updateRoleInfo(String jsbh, String jsmc,String xgr) {
		RoleInfoPo po = new RoleInfoPo();
		//设置角色编号
		po.setJsbh(jsbh);
		//设置角色名称
		po.setJsmc(jsmc);
		//设置创建人
		po.setXgr(xgr);
		//设置创建时间
		po.setXgsj(new Date());
		try {
			Integer i = roleInfoMapper.updateById(po);
			if(i>0) {
				return true;
			}else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("修改角色信息失败",e);
		}
	}

	/** 
	 * Method Name:  distrRoleList
	 * Description:  
	 * 批量给老师或学生添加角色
	 * @param dtoList 封装对象
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	@Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
	public Integer distrRoleList(RoleUserDto dto) {
		try {
			List<RoleUserRelationDto> dtoList = new ArrayList<RoleUserRelationDto>();
			if(dto.getTeaList().size() > 0) {  //老师列表
				for (String yhbh : dto.getTeaList()) {
					RoleUserRelationDto rDto = new RoleUserRelationDto();
					rDto.setJsbh(dto.getJsbh());
					rDto.setYhbh(yhbh);
					rDto.setYhlx("1"); //用户类型（1老师，0学生）
					dtoList.add(rDto);
				}
			}
			if(dto.getStuList().size() > 0) {  //学生列表
				for (String yhbh : dto.getStuList()) {
					RoleUserRelationDto rDto = new RoleUserRelationDto();
					rDto.setJsbh(dto.getJsbh());
					rDto.setYhbh(yhbh);
					rDto.setYhlx("0"); //用户类型（1老师，0学生）
					dtoList.add(rDto);
				}
			}
			//1、先删除对应角色的用户
			EntityWrapper<RoleUserRelationPo> ew = new EntityWrapper<>();
			ew.where("JSBH = {0}", dto.getJsbh());
			roleUserRelationMapper.delete(ew);
			
			//2、重新插入角色用户关系表
			Integer count = 0;
			Integer i = 0;
			List<RoleUserRelationPo> poList =  BeanCopyUtils.copyListProperties(dtoList, RoleUserRelationPo.class);
			for (RoleUserRelationPo roleUserRelationPo : poList) {
				i = roleUserRelationMapper.insert(roleUserRelationPo);
				count = count + i;
			}
			return count;
		} catch (Exception e) {
			throw new DBException("分配用户失败,请联系管理员",e);
		}
	}

	/** 
	 * Description: 查询角色信息
	 * @param page 
	 * @param jsmc 角色名称
	 * @return Page<RoleInfoVo>
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	public Page<RoleInfoVo> selectRoleInfo(Page<RoleInfoVo> page, String jsmc) {
		List<RoleInfoVo> voList = null;
		try {
			voList = roleInfoMapper.selectRoleInfo(page, jsmc);
		} catch (Exception e) {
			e.printStackTrace();
			throw new DBException("查询角色信息失败",e);
		}
		for (RoleInfoVo roleInfoVo : voList) {
			if(roleInfoVo.getRoleCount() == null) {
				roleInfoVo.setRoleCount(0);
			}
		}
		return page.setRecords(voList);
	}

	/** 
	 * Description: 根据角色编号查询用户
	 * @param jsbh 角色编号
	 * @return List<RoleUserRelationVo>
	 * @author LuHuaCong
	 * @date: 2018年12月28日
	 */
	@Override
	public List<RoleUserRelationVo> selectRoleByJsbh(String jsbh) {
		EntityWrapper<RoleUserRelationPo> ew = new EntityWrapper<>();
		ew.where("JSBH = {0}", jsbh);
		List<RoleUserRelationPo> poList = null;
		try {
			poList = roleUserRelationMapper.selectList(ew);
		} catch (Exception e) {
			e.printStackTrace();
			throw new CloudException("查询该角色的用户信息失败",e);
		}
		List<RoleUserRelationVo> voList = BeanCopyUtils.copyListProperties(poList, RoleUserRelationVo.class);
		return voList;
	}

	/**
	 * 查询教职工列表（同时标识该教职工是否已经被分配角色）
	 * @caihuihai 2019-01-03
	 */
	@Override
	public Page<TeacherVo> queryJzgListByJsbh(Page<TeacherVo> page, String jsbh,String gh, String xm, String dwh) {
		try {
			return page.setRecords(teacherMapper.queryJzgListByJsbh(page,jsbh,gh,xm,dwh));
		} catch (Exception e) {
			e.printStackTrace();
			throw new CloudException("查询教职工信息失败",e);
		}
	}

	/**
	 * 查询对应的学生列表
	 * @caihuihai 2019-01-03
	 */
	@Override
	public Page<StudentVo> queryStuListByJsbh(Page<StudentVo> page, String jsbh, String xh, String xm, String nj,
			String xy, String zyfx, String bjid) {
		try {
			return page.setRecords(studentInfoMapper.queryStuListByJsbh(page,jsbh,xh,xm,nj,xy,zyfx,bjid));
		} catch (Exception e) {
			e.printStackTrace();
			throw new CloudException("查询学生信息失败",e);
		}
	}

	
}
